package com.luxsoft.siipap.em.replica.importadores.cxc.parches;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;

import com.luxsoft.siipap.cxc.model.Aplicacion;
import com.luxsoft.siipap.cxc.model.AplicacionDePago;
import com.luxsoft.siipap.cxc.model.Pago;
import com.luxsoft.siipap.service.ServiceLocator2;

/**
 * PARCHE PARA ELIMINAR PAGOS Y APLICACIONES DE PAGOS REPETIDAS EN EL PROCESO DE MIGRACION
 * DE ORACLE A MYSQL SE DEBEN GENERAR MEDIANTE SQL UNA TABLA PARA ALMACENAR LOS SIIPAP_ID DE LOS PAGOS
 * REPETIDOS Y OTRA PARA LAS APLICACIONES DE PAGO REPETIDOS 
 * 
 * EN AMBOS CASOS PUEDEN SER TRIPLICADOS O MAS, ESTE PROCESO ARREGLA CUALQUIER MULTIPLICIDAD
 * 
 * NOTA:  CUIDADO AL EJECUTAR, PUEDE ELIMINAR DATOS SI SE CORRE MAS DE UNA VEZ PARA EL
 * 		  MISMO PAGO Y/O APLICACION
 * 
 * @author Ruben Cancino Ramos
 *
 */
public class AjusteDePagosRepetidos {
	
	public void eleiminarPagosDuplicados(){
		
		System.out.println("correccion de pagos duplicados");
		
		//String sql="select SIIPAP_ID from pagos_duplicados_temp";
		String sql="select SIIPAP_ID" +
				" from sx_cxc_abonos where tipo_id like \'PAGO%\'" +
				" group by siipap_id having count(*)>1" 
				//" order by clave,siipap_id"
				;
		
		List data =ServiceLocator2.getJdbcTemplate().queryForList(sql,Long.class);
		
		//Eliminar duplicados al 100% sin aplicaciones
		for(Object o:data){
			Long id=(Long)o;
			String hql="from Pago p where p.siipapId=? order by p.clave ";
			List<Pago> pagos=ServiceLocator2.getHibernateTemplate().find(hql, id);
			
			for(Pago p:pagos){
				if(p.getTotal().equals(p.getDisponible())){
					System.out.println("Eliminar: "+p);
					try {
						ServiceLocator2.getUniversalDao().remove(Pago.class, p.getId());
					} catch (Exception e) {
						e.printStackTrace();
					}
					
				}
			}
		}
		
		//Eliminar duplicados con suma de aplicaciones en ambos pagos = al total del abono
		
		for(Object o:data){
			Long id=(Long)o;
			if(id!=null)
				eliminarDuplicadosConAplicacionesComplementarias(id);
		}
		
		int rows=0;
		for(Object o:data){
			//System.out.println("Pago duplicado:"+o);
			Long id=(Long)o;
			String hql="from Pago p where p.siipapId=? order by p.clave ";
			List<Pago> pagos=ServiceLocator2.getHibernateTemplate().find(hql, id);			
			
			
			if(pagos.size()>1){
				for(int index=0;index<pagos.size();index++){
					Pago p=pagos.get(index);
					
					String pattern="{0},{1},{2,number,#.#},{3,number,#.#},{4,date,short},{5},{6},{7}";
					String mes=MessageFormat.format(pattern
							, p.getClave()
							,StringUtils.remove(p.getNombre(), ',')							
							,p.getDisponible()
							,p.getTotal()
							,p.getFecha()
							,p.getInfo()
							,p.getComentario()
							,p.getId()
							);
					System.out.println(mes);
					//System.out.println("Duplicado: "+duplicado);
					//System.out.println("Eliminando : "+delete);
					rows++;
					//ServiceLocator2.getUniversalDao().remove(Pago.class, delete.getId());
				}
			}
		}
		System.out.println("Eliminados: "+rows);
	}
	
	private void eliminarDuplicadosConAplicacionesComplementarias(final Long siipapId){
		
		ServiceLocator2.getHibernateTemplate().execute(new HibernateCallback(){
			public Object doInHibernate(Session session)throws HibernateException, SQLException {
				String hql="from Pago p where p.siipapId=? order by p.clave ";
				List<Pago> pagos=session.createQuery(hql).setLong(0, siipapId)
				.list();
				if(pagos.size()==2){
					BigDecimal total=pagos.get(0).getTotal();
					BigDecimal aplicado=BigDecimal.ZERO;
					for(Pago p:pagos){				
						aplicado=aplicado.add(p.getAplicado());
					}
					if(total.equals(aplicado)){
						System.out.println("Consolidando aplicaciones en un pago suman el total del pago: "+pagos.get(0).getTotal());
						Pago p1=pagos.get(0);
						Pago p2=pagos.get(1);
						for(Aplicacion a:p2.getAplicaciones()){
							if(a==null) 
								continue;
							a.setAbono(p1);
							p1.getAplicaciones().add(a);
							a.actualizarDetalle();
						}
						//p2.getAplicaciones().clear();
						//session.delete(p2);
						session.flush();
						session.clear();
						
					}
				}
				return null;
			}
			
		});
		
		
		
		
	}
	
	public void eleiminarAplicacionesDuplicados(){
		
		System.out.println("correccion de aplicaciones duplicados");
		
		String sql="select SIIPAP_ID from aplicaciones_pagos_temp";
		
		List data =ServiceLocator2.getJdbcTemplate().queryForList(sql,Long.class);	
		int rows=0;
		for(Object o:data){
			System.out.println("Aplicacion duplicada:"+o);
			Long id=(Long)o;
			String hql="from AplicacionDePago p where p.siipapId=? order by p.comentario desc";
			List<AplicacionDePago> aplicaciones=ServiceLocator2.getHibernateTemplate().find(hql, id);
			
			if(aplicaciones.size()>1){
				for(int index=1;index<aplicaciones.size();index++){
					AplicacionDePago delete=aplicaciones.get(index);
					System.out.println("Eliminando : "+delete);
					rows++;
					//ServiceLocator2.getUniversalDao().remove(AplicacionDePago.class, delete.getId());
				}
			}
		}
		System.out.println("Eliminados: "+rows);
	}
	
	public static void main(String[] args) {
		new AjusteDePagosRepetidos().eleiminarPagosDuplicados();
		//new AjusteDePagosRepetidos().eleiminarAplicacionesDuplicados();
	}

}
